package net.lab1024.sa.admin.module.business.supercomputer.sendtask;

import lombok.extern.slf4j.Slf4j;
import net.lab1024.sa.admin.module.business.supercomputer.datatask.dao.DatataskDao;
import net.lab1024.sa.admin.module.business.supercomputer.datatask.domain.bo.DatataskBO;
import net.lab1024.sa.base.module.support.job.api.SmartJobService;
import net.lab1024.sa.base.module.support.job.core.SmartJob;
import net.lab1024.sa.base.module.support.job.repository.domain.SmartJobEntity;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Service
public class AddScheduled implements SmartJob {
    @Resource
    DatataskDao datataskDao;
    @Resource
    @Lazy//防止依赖循环
    SmartJobService smartJobService;
    /**
     * 定时进行表添加
     * @param param 可选参数 任务不需要时不用管
     * @return
     */
    @Override
    public String run(String param) {
        //扫表获取Task数据
        List<DatataskBO> enabledTasks = datataskDao.selectEnabledTask();
        //将Task列表转换为Job列表

        //
        List<SmartJobEntity> jobList = enabledTasks.stream().map(task ->{
            SmartJobEntity job = new SmartJobEntity();
            //任务名称->可修改
            job.setJobName("数据传输任务("+task.getTaskId().toString()+")");
            //执行类(数据库内设置不能重复需要修改)
            job.setJobClass("net.lab1024.sa.admin.module.business.supercomputer.sendtask.SendInitiation");
            //获取数据
            HashMap<String, String> timeMap = this.getTimeMap(task.getTriggerType(),task.getTriggerTime());
            // 触发类型
            job.setTriggerType(timeMap.entrySet().iterator().next().getKey());
            //触发值,需要进行处理 日期->cron式 固定间隔不变
            job.setTriggerValue(timeMap.entrySet().iterator().next().getValue());
            //设置参数
            job.setParam(task.getTaskId().toString());

            //通用属性设置
            job.setSort(99);
            //创建后默认可用
            job.setEnabledFlag(true);
            //更新时间为数据源传输任务的时间 此处不同于其他定时任务的时间,此处用于更新数据任务使用
            job.setUpdateTime(task.getUpdateTime());
            //创建时间为扫表时间
            job.setCreateTime(LocalDateTime.now());
            //更新人为系统
            job.setUpdateName("系统定时创建");
            //任务描述
            job.setRemark("数据同步任务");
            return job;
        })
            .collect(Collectors.toList());

        System.out.println(jobList);
        //添加任务
        smartJobService.addJob(jobList);

        return "本次添加+"+jobList.size()+"个任务";
    }
    private HashMap<String, String> getTimeMap(String type,String value) {
        HashMap<String, String> resultMap = new HashMap<>();

        if ("cycle".equalsIgnoreCase(type)) {
            // 当 type 为 "cycle"，保持 value 不变
            resultMap.put("fixed_delay", value);
        } else if ("random".equalsIgnoreCase(type)) {
            // 当 type 为 "random"，将 value 转换为 cron 形式
            String convertedValue = convertToCronFormat(value);
            resultMap.put("cron", convertedValue);
        }

        return resultMap;
    }
    //cron表达式转换函数
    private String convertToCronFormat(String value) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date date = sdf.parse(value);
            SimpleDateFormat cronSecond = new SimpleDateFormat("s"); // 秒
            SimpleDateFormat cronMinute = new SimpleDateFormat("m");
            SimpleDateFormat cronHour = new SimpleDateFormat("H");
            SimpleDateFormat cronDay = new SimpleDateFormat("d");
            SimpleDateFormat cronMonth = new SimpleDateFormat("M");
            SimpleDateFormat cronWeekday = new SimpleDateFormat("u"); // 1=Monday, 7=Sunday

            // 获取各个时间部分
            String second = cronSecond.format(date); // 秒
            String minute = cronMinute.format(date);
            String hour = cronHour.format(date);
            String day = cronDay.format(date);
            String month = cronMonth.format(date);
            String weekday = cronWeekday.format(date);//年位舍弃不用

            // 返回 cron 格式
            return String.format("%s %s %s %s %s *", second, minute, hour, day, month);

        } catch (ParseException e) {
            // 如果解析失败，可以选择抛出异常或返回默认值
            return "0 0 * * * *"; // 默认每小时执行一次
        }
    }
}
